package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpSocPlanItemDAO;
import org.jsola.hr.dto.EmpSocItemDTO;
import org.jsola.hr.dto.EmpSocPlanItemAddDTO;
import org.jsola.hr.dto.EmpSocPlanItemUpdateDTO;
import org.jsola.hr.entity.EmpSocInfoDO;
import org.jsola.hr.entity.EmpSocPlanDO;
import org.jsola.hr.entity.EmpSocPlanItemDO;
import org.jsola.hr.query.EmpSocPlanItemQuery;
import org.jsola.hr.vo.EmpSocPlanItemListVO;
import org.jsola.hr.vo.EmpSocPlanItemVO;
import org.jsola.user.core.TokenUser;

import java.util.List;
import java.util.Map;


/**
 * 增减员计划子项表
 *
 * @author zhr
 */
public interface IEmpSocPlanItemService extends IService<IEmpSocPlanItemDAO, EmpSocPlanItemDO> {

    /**
     * 新增增减员计划子项表
     *
     * @param empSocPlanItemAddDTO 新增增减员计划子项表DTO
     * @param tokenUser            当前用户
     * @return 增减员计划子项表详情信息
     */
    EmpSocPlanItemVO save(EmpSocPlanItemAddDTO empSocPlanItemAddDTO, TokenUser tokenUser);

    /**
     * 修改增减员计划子项表
     *
     * @param empSocPlanItemUpdateDTO 修改增减员计划子项表DTO
     * @param tokenUser               当前用户
     * @return 更新数量
     */
    int update(EmpSocPlanItemUpdateDTO empSocPlanItemUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除增减员计划子项表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser         当前用户
     * @param empSocPlanItemIds 增减员计划子项表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... empSocPlanItemIds);

    /**
     * 根据增减员计划子项表id查找
     *
     * @param empSocPlanItemId 增减员计划子项表id
     * @param siteId           所属站点id
     * @return 增减员计划子项表详情信息
     */
    EmpSocPlanItemVO selectById(String empSocPlanItemId, String siteId);

    /**
     * 查询增减员计划子项表
     *
     * @param empSocPlanItemQuery 查询条件
     * @param siteId              所属站点id
     * @return 增减员计划子项表列表信息
     */
    List<EmpSocPlanItemListVO> select(EmpSocPlanItemQuery empSocPlanItemQuery, String siteId);

    /**
     * 查询增减员计划子项表记录数
     *
     * @param empSocPlanItemQuery 查询条件
     * @param siteId              所属站点id
     * @return 增减员计划子项表记录数
     */
    int selectCount(EmpSocPlanItemQuery empSocPlanItemQuery, String siteId);

    /**
     * 分页查询增减员计划子项表
     *
     * @param empSocPlanItemQuery 查询条件
     * @param siteId              所属站点id
     * @return 增减员计划子项表列表信息
     */
    Page<EmpSocPlanItemListVO> selectPage(EmpSocPlanItemQuery empSocPlanItemQuery, String siteId);


    /**
     * 根据增减员计划子项表id查找
     *
     * @param empSocPlanItemId 增减员计划子项表id
     * @param siteId           所属站点id
     * @return 增减员计划子项表
     */
    EmpSocPlanItemDO selectDOById(String empSocPlanItemId, String siteId);

    /**
     * 查询增减员计划子项表
     *
     * @param empSocPlanItemQuery 查询条件
     * @param siteId              所属站点id
     * @return 增减员计划子项表列表
     */
    List<EmpSocPlanItemDO> selectDO(EmpSocPlanItemQuery empSocPlanItemQuery, String siteId);

    /**
     * 保存增减员计划子项列表
     *
     * @param empSocPlanItemList 子项列表
     */
    void bachSave(List<EmpSocPlanItemDO> empSocPlanItemList);

    /**
     * 根据增减员计划查询计划子项
     *
     * @param planId    计划Id
     * @param tokenUser 当前用户
     * @return 子项列表
     */
    List<EmpSocPlanItemDO> selectByPlanId(String planId, TokenUser tokenUser);

    /**
     * 根据增减员计划ID列表查询计划子项
     *
     * @param planIdList 计划Id
     * @param tokenUser  当前用户
     * @return 子项列表
     */
    Map<String, List<EmpSocPlanItemDO>> selectByPlanIdList(List<String> planIdList, TokenUser tokenUser);

    /**
     * 根据增减员计划ID列表查询计划子项
     *
     * @param planIdList 计划Id
     * @param tokenUser  当前用户
     * @return 子项列表
     */
    List<EmpSocPlanItemVO> selectByPlanIds(List<String> planIdList, TokenUser tokenUser);

    /**
     * 查询租户下所有子项
     *
     * @param tokenUser 当前用户
     * @return 子项列表
     */
    List<EmpSocPlanItemDO> selectBySite(TokenUser tokenUser);

    /**
     * 查询用工单位下所有子项
     *
     * @param companyId 用工单位Id
     * @param tokenUser 当前用户
     * @return 子项列表
     */
    List<EmpSocPlanItemVO> selectByCompanyId(String companyId, TokenUser tokenUser);

    /**
     * 删除增减员计划下的子项列表
     *
     * @param planId    计划Id
     * @param tokenUser 当前用户
     */
    void deleteByPlanId(String planId, TokenUser tokenUser);

}


